// serialize.h
// 序列化相关函数
#pragma once
#include "../include/obj.h"

/*定义：自动定长
设a是A类型的对象，b是a序列化后的字节串，c是任意字节串，d是b和c连接在一起后的字节串（例如b=001,c=234,d=001234）；
如果对于任意的d，都可以不借助其它参数（只有d的内容和长度）求得b的长度，则称A的序列化是“自动定长”的。
*/

class ISerilize : public CVirtualDestruct
{ // 序列化抽象类
public:
    ISerilize() {};
    virtual ~ISerilize() {};

    /*反序列化
    data    输入数据
    iLen    I/O 输入data总长度，输出实际读取长度。如果序列化方式不能自动定长，允许没有输出。
    */
    virtual int FromBytesEx(const BYTE *data, int &iLen) = 0;
    virtual int FromBytes(const BYTE *data, int iLen) { return FromBytesEx(data, iLen); };
    virtual int FromBytes(const STD_BUFFER &bufData) { return FromBytes(bufData.data(), bufData.size()); };

    /*序列化
    data    输出数据
    iLen    I/O 输入data最大长度，输出实际长度
    返回值：0成功，<0失败。
    */
    virtual int ToBytes(OUT BYTE *data, int &iLen) = 0;
    virtual int ToBytes(STD_BUFFER &bufOut);

    virtual int ToByteSize() = 0; // 返回序列化所需字节数。允许大于实际序列化结果。
};

/*序列化U64类型整数
u64Data     输入数据
pOut        输出数据
iLE         目标字节序是不是小端序
*/
int SAPI_U64ToBytes(U64 u64Data, BYTE *pOut, int iLE = 0);

/*反序列化U64类型整数
data    输入数据
iLE     目标字节序是不是小端序
*/
U64 SAPI_U64FromBytes(const BYTE *data, int iLE = 0);

// class Serializable//20231027废弃
